﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Autoverwaltung.Fachkonzept
{
    public class Fachkonzept : IFachkonzept
    {
        private static Fachkonzept me = null;
        private Datenhaltung.IDatenhaltung datenhaltung;
        private IUserInterface userInterface;

        private Fachkonzept(IUserInterface ui)
        {
            this.userInterface = ui;

            try
            {
                this.datenhaltung = Datenhaltung.DatenhaltungFabrik.ErstelleDatenhaltung(Datenhaltung.DatenhaltungsTypen.XML);
            }
            catch (Exception ex)
            {
                this.userInterface.DisplayException(ex);
            }
        }

        public static Fachkonzept GetInstance(IUserInterface ui)
        {
            if (ui == null)
            {
                throw new ArgumentNullException("ui");
            }

            if (me == null)
            {
                me = new Fachkonzept(ui);
            }
            return me;
        }

        public bool NeuerHersteller(Model.Hersteller hersteller)
        {
            return this.datenhaltung.NeuerHersteller(hersteller);
        }

        public bool NeuesModell(Model.Modell modell)
        {
            return this.datenhaltung.NeuesModell(modell);
        }

        public bool NeuesAuto(Model.Auto auto)
        {
            return this.datenhaltung.NeuesAuto(auto);
        }

        public Model.Hersteller[] GibHersteller()
        {
            return this.datenhaltung.LadeHersteller();
        }

        public Model.Modell[] GibModelle()
        {
            return this.datenhaltung.LadeModelle();
        }

        public Model.Modell[] GibModelleNach(Model.Hersteller hersteller)
        {
            List<Model.Modell> modelle = new List<Model.Modell>();

            if (hersteller != null)
            {
                foreach (Model.Modell modell in this.GibModelle())
                {
                    if (modell.Hersteller != null &&
                        modell.Hersteller.Id.Equals(hersteller.Id))
                    {
                        modelle.Add(modell);
                    }
                }
            }

            return modelle.ToArray();
        }

        public Model.Auto[] GibAutos()
        {
            return this.datenhaltung.LadeAutos();
        }

        public Model.Auto[] GibAutosNach(Model.Hersteller hersteller)
        {
            List<Model.Auto> autos = new List<Model.Auto>();

            if (hersteller != null)
            {
                foreach (Model.Auto auto in this.GibAutos())
                {
                    if (auto.Modell != null && auto.Modell.Hersteller != null &&
                        auto.Modell.Hersteller.Id.Equals(hersteller.Id))
                    {
                        autos.Add(auto);
                    }
                }
            }

            return autos.ToArray();
        }

        public Model.Auto[] GibAutosNach(Model.Modell modell)
        {
            List<Model.Auto> autos = new List<Model.Auto>();

            if (modell != null)
            {
                foreach (Model.Auto auto in this.GibAutos())
                {
                    if (auto.Modell != null && auto.Modell.Id.Equals(modell.Id))
                    {
                        autos.Add(auto);
                    }
                }
            }

            return autos.ToArray();
        }

        public bool BearbeiteHersteller(int herstellerId, Model.Hersteller hersteller)
        {
            return this.datenhaltung.BearbeiteHersteller(herstellerId, hersteller);
        }

        public bool BearbeiteModell(int modellId, Model.Modell modell)
        {
            return this.datenhaltung.BearbeiteModell(modellId, modell);
        }

        public bool BearbeiteAuto(int autoId, Model.Auto auto)
        {
            return this.datenhaltung.BearbeiteAuto(autoId, auto);
        }

        public bool LoescheHersteller(int herstellerId)
        {
            return this.datenhaltung.LoescheHersteller(herstellerId);
        }

        public bool LoescheModell(int modellId)
        {
            return this.datenhaltung.LoescheModell(modellId);
        }

        public bool LoescheAuto(int autoId)
        {
            return this.datenhaltung.LoescheAuto(autoId);
        }
        
        public void BeendeAnwendung()
        {
            Environment.Exit(0);
        }


        public Model.Hersteller GibHersteller(int id)
        {
            foreach (Model.Hersteller hersteller in this.GibHersteller())
            {
                if(hersteller.Id.Equals(id))
                {
                    return hersteller;
                }
            }
            return null;
        }

        public Model.Modell GibModell(int id)
        {
            foreach (Model.Modell modell in this.GibModelle())
            {
                if(modell.Id.Equals(id))
                {
                    return modell;
                }
            }
            return null;
        }

        public Model.Auto GibAuto(int id)
        {
            foreach (Model.Auto auto in this.GibAutos())
            {
                if(auto.Id.Equals(id))
                {
                    return auto;
                }
            }
            return null;
        }
    }
}
